package com.freemarker.test.util;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.StringWriter;
import java.io.Writer;
import java.util.Map;

import freemarker.template.Configuration;
import freemarker.template.DefaultObjectWrapper;
import freemarker.template.Template;
import freemarker.template.TemplateException;

/**
 * 模板工具类
 * @author kbl
 *
 */
public class FreeMarkerUtil {

	/**
	 * 
	 * @param templateName  模板文件名称
	 * @param templateEncoding  模板文件的编码方式
	 * @param root  数据模型根对象
	 */
	public static void analysisTemplate(String templateName,String templateEncoding,Map<?,?> root){
		
		
		try {
			Configuration config = new Configuration();
			config.setOutputEncoding("utf-8");
			
			File file = new File("src/templates");
			
			//设置要解析的模板所在的目录，并加载模板文件
			config.setDirectoryForTemplateLoading(file);
			
			//设置包装器，并将对象包装为数据模型
			config.setObjectWrapper(new DefaultObjectWrapper());
			
			//获取模板,并设置编码方式，这个编码必须要与页面中的编码格式一致
			Template template=config.getTemplate(templateName,templateEncoding);
			//合并数据模型与模板
			Writer out = new OutputStreamWriter(System.out);
			
			template.process(root, out);
			out.flush();
			out.close();
			
		} catch (IOException e) {
			
			e.printStackTrace();
		} catch (TemplateException e) {
		
			e.printStackTrace();
		}
		
		
	}
	
	public static void analysisTemplate(String templateName,Map<?,?> root){
		analysisTemplate(templateName, "UTF-8", root);
	}
	
	//处理模板并将结果转为String
	public static String processTemplateIntoString(Template template, Object model) throws IOException, TemplateException {
		StringWriter result = new StringWriter();
		template.process(model, result);
		return result.toString();
	}
	
	
	public static void analysisTemplate2(String templateName,String templateEncoding,Map<?,?> root,File outFile){
		
		
		try {
			Configuration config = new Configuration();
			config.setOutputEncoding("utf-8");
			
			File file = new File("src/templates");
			
			//设置要解析的模板所在的目录，并加载模板文件
			config.setDirectoryForTemplateLoading(file);
			
			//设置包装器，并将对象包装为数据模型
			config.setObjectWrapper(new DefaultObjectWrapper());
			
			//获取模板,并设置编码方式，这个编码必须要与页面中的编码格式一致
			Template template=config.getTemplate(templateName,templateEncoding);
			
			FileOutputStream fos = new FileOutputStream("D:/2.html");
			
			//合并数据模型与模板
			Writer out = new OutputStreamWriter(fos);
			
			template.process(root, out);
			out.flush();
			out.close();
			
		} catch (IOException e) {
			
			e.printStackTrace();
		} catch (TemplateException e) {
		
			e.printStackTrace();
		}
		
		
	}

	
}
